
package gtd;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class AccesoBBDD{
    private static final String conexionURL = "jdbc:mysql://localhost:3306/gtd";
    private static Connection conexion = null;

    public AccesoBBDD(){
        // Carga el driver JDBC
	try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
	} catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    private static void conectar(){
        // Carga el driver JDBC
	try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
	} catch (Exception e) {
            System.out.println(e.getMessage());
        }

        try {
            conexion = DriverManager.getConnection(conexionURL, "gtd", "gtd2013");
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    private static void desconectar(){
        try {
            conexion.close();
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static boolean anhadirTarea(TareaBean t, int idProyecto) {
        String nombre = t.getNombre();
        Date fechaInicio = t.getFechaInicio();
        Date fechaFinal = t.getFechaFinal();
        
        // Hace este apaño para interpretar el id de proyecto 0 como nulo
        String id = Integer.valueOf(idProyecto).toString();
        if(id.equals("0"))
            id = "NULL";
        
        // Utiliza el driver cargado para realizar la conexión
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            if(fechaFinal!=null)
                statement.executeUpdate("INSERT INTO tarea "
                + "(nombre, idProyecto, fechaInicio, fechaFinal) "
                + "VALUES ('"+nombre+"',"+id+",'"+fechaInicio+"','"+fechaFinal+"');");
            else
                statement.executeUpdate("INSERT INTO tarea "
                + "(nombre, idProyecto, fechaInicio, fechaFinal) "
                + "VALUES ('"+nombre+"',"+id+",'"+fechaInicio+"',NULL);");
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        }
    }

    public static boolean borrarTarea(String nombre) {
        // Utiliza el driver cargado para realizar la conexión
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            statement.executeUpdate("DELETE FROM tarea "
                + "WHERE nombre='"+nombre+"';");  
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        }  
    }

    public static boolean modificarTarea(int id, String nombre, Date fechaInicio, Date fechaFin) {
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            statement.executeUpdate("UPDATE tarea "
                + "SET nombre='"+nombre+"',fechaInicio='"+fechaInicio+"',fechaFinal='"+fechaFin+"' "
                + "WHERE id="+id+";");  
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        }  
    }

    public static boolean anhadirProyecto(ProyectoBean p) {
        String nombre = p.getNombre();
        Date fechaInicio = p.getFechaInicio();
        Date fechaFinal = p.getFechaFinal();
        
        // Utiliza el driver cargado para realizar la conexión
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            if(fechaFinal!=null)
                statement.executeUpdate("INSERT INTO proyecto "
                + "(nombre, fechaInicio, fechaFinal) "
                + "VALUES ('"+nombre+"','"+fechaInicio+"','"+fechaFinal+"');");
            else
                statement.executeUpdate("INSERT INTO proyecto "
                + "(nombre, fechaInicio, fechaFinal) "
                + "VALUES ('"+nombre+"','"+fechaInicio+"',NULL);");
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        }   
    }

    public static boolean eliminarProyecto(String nombre) {
        // Utiliza el driver cargado para realizar la conexión
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            statement.executeUpdate("DELETE FROM proyecto "
                + "WHERE nombre='"+nombre+"';");
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        }
    }

    public static boolean modificarProyecto(int id, String nombre, Date fechaInicio, Date fechaFin) {
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            statement.executeUpdate("UPDATE proyecto "
                + "SET nombre='"+nombre+"',fechaInicio='"+fechaInicio+"',fechaFinal='"+fechaFin+"' "
                + "WHERE id="+id+";");  
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        }  
    }

    public static boolean asignarTareaProyecto(String nombreTarea, String nombreProyecto) {
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            // Obtiene el ID del proyecto
            ResultSet r = statement.executeQuery("SELECT id FROM proyecto "
                    + "WHERE nombre='"+nombreProyecto+"';");
            r.next();
            int id = r.getInt("id");
            
            // Realiza la asignación
            statement.executeUpdate("UPDATE tarea "
                    + "SET idProyecto = "+id+" "
                    + "WHERE nombre='"+nombreTarea+"';");
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        } 
    }

    public static boolean desasignarTareaProyecto(String nombreTarea) {
        conectar();

        try {
            Statement statement = conexion.createStatement();
            
            statement.executeUpdate("UPDATE tarea "
                    + "SET idProyecto = NULL "
                    + "WHERE nombre='"+nombreTarea+"';");
            
            desconectar();
            return true;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return false;
        }  
    }

    public static List<TareaBean> obtenerTareas() {
        conectar();
        
        List<TareaBean> lista = new ArrayList<TareaBean>();
        int id;
        String nombre;
        Date fechaInicio, fechaFinal;

        try {
            Statement statement = conexion.createStatement();
            
            ResultSet r = statement.executeQuery("SELECT * FROM tarea;");
            
            while(r.next()){
                TareaBean t = new TareaBean();
                nombre = r.getString("nombre");
                id = r.getInt("id");
                fechaInicio = r.getDate("fechaInicio");
                fechaFinal = r.getDate("fechaFinal");
                
                t.setId(id);
                t.setNombre(nombre);
                t.setFechaInicio(fechaInicio);
                t.setFechaFinal(fechaFinal);
                
                lista.add(t);
            }
                        
            desconectar();
            return lista;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return null;
        }  
    }

    public static TareaBean obtenerTarea(String nombre) {
        conectar();
        
        TareaBean t = new TareaBean();
        int id;
        Date fechaInicio, fechaFinal;

        try {
            Statement statement = conexion.createStatement();
            
            ResultSet r = statement.executeQuery("SELECT * FROM tarea "
                    + "WHERE nombre='"+nombre+"';"); 
            
            // Devuelve null si no hay coincidencia
            if(!r.next()){
                desconectar();
                return null;
            }
            
            id = r.getInt("id");
            fechaInicio = r.getDate("fechaInicio");
            fechaFinal = r.getDate("fechaFinal");
            
            desconectar();
                
            t.setId(id);
            t.setNombre(nombre);
            t.setFechaInicio(fechaInicio);
            t.setFechaFinal(fechaFinal);

            return t;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return null;
        }
    }

    public static List<ProyectoBean> obtenerProyectos() {
        conectar();
        
        List<ProyectoBean> lista = new ArrayList<ProyectoBean>();
        int id;
        String nombre;
        Date fechaInicio, fechaFinal;

        try {
            Statement statement = conexion.createStatement();
            
            ResultSet r = statement.executeQuery("SELECT * FROM proyecto;");
            while(r.next()){
                ProyectoBean p = new ProyectoBean();
                nombre = r.getString("nombre");
                id = r.getInt("id");
                fechaInicio = r.getDate("fechaInicio");
                fechaFinal = r.getDate("fechaFinal");
                
                p.setId(id);
                p.setNombre(nombre);
                p.setFechaInicio(fechaInicio);
                p.setFechaFinal(fechaFinal);
                
                lista.add(p);
            }
            
            desconectar();
            return lista;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return null;
        }
    }

    public static ProyectoBean obtenerProyecto(String nombre) {
        conectar();
        
        ProyectoBean p = new ProyectoBean();
        int id;
        Date fechaInicio, fechaFinal;

        try {
            Statement statement = conexion.createStatement();
            
            ResultSet r = statement.executeQuery("SELECT * FROM proyecto "
                    + "WHERE nombre='"+nombre+"';");
            
             // Devuelve null si no hay coincidencia
            if(!r.next()){
                desconectar();
                return null;
            }
            
            id = r.getInt("id");
            fechaInicio = r.getDate("fechaInicio");
            fechaFinal = r.getDate("fechaFinal");
                
            desconectar();
             
            p.setId(id);
            p.setNombre(nombre);
            p.setFechaInicio(fechaInicio);
            p.setFechaFinal(fechaFinal);
            
            return p;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return null;
        }   
    }

    public static List<TareaBean> filtrarTareas(String filtro, Object valor) {
        conectar();
        
        ResultSet r = null;
        List<TareaBean> lista = new ArrayList<TareaBean>();
        int id;
        String nombre;
        Date fechaInicio, fechaFinal;
        
        try {
            Statement statement = conexion.createStatement();
            
            // Según el campo de filtro, busca una cosa u otra
            switch (filtro) {
                case "nombre":
                    r = statement.executeQuery("SELECT * FROM tarea "
                    + "WHERE nombre='"+valor+"';");
                    break;
                case "idProyecto":
                    // No asociado a proyecto
                    if(valor.toString().equals("NULL"))
                        r = statement.executeQuery("SELECT * FROM tarea "
                        + "WHERE idProyecto IS NULL;");
                    else
                        r = statement.executeQuery("SELECT * FROM tarea "
                        + "WHERE idProyecto="+valor+";");
                    break;
                case "fechaInicio":
                    r = statement.executeQuery("SELECT * FROM tarea "
                    + "WHERE fechaInicio='"+valor+"';");
                    break;
                case "fechaFinal":
                    r = statement.executeQuery("SELECT * FROM tarea "
                    + "WHERE fechaFinal='"+valor+"';");
                    break;
            }
            
            while(r.next()){
                TareaBean t = new TareaBean();
                nombre = r.getString("nombre");
                id = r.getInt("id");
                fechaInicio = r.getDate("fechaInicio");
                fechaFinal = r.getDate("fechaFinal");
                
                t.setId(id);
                t.setNombre(nombre);
                t.setFechaInicio(fechaInicio);
                t.setFechaFinal(fechaFinal);
                
                lista.add(t);
            }
            
            desconectar();
            return lista;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return null;
        }
    }

    public static List<ProyectoBean> filtrarProyectos(String filtro, Object valor) {
        
        conectar();
        
        ResultSet r = null;
        List<ProyectoBean> lista = new ArrayList<ProyectoBean>();
        int id;
        String nombre;
        Date fechaInicio, fechaFinal;

        try {
            Statement statement = conexion.createStatement();
            
            // Según el campo de filtro, busca una cosa u otra
            switch(filtro){
                case "nombre":
                    r = statement.executeQuery("SELECT * FROM proyecto "
                    + "WHERE nombre='"+valor+"';");
                    break;
                case "fechaInicio":
                    r = statement.executeQuery("SELECT * FROM tarea "
                    + "WHERE fechaInicio='"+valor+"';");
                    break;
                case "fechaFinal":
                    r = statement.executeQuery("SELECT * FROM tarea "
                    + "WHERE fechaFinal='"+valor+"';");
                    break;
            }
            
            while(r.next()){
                ProyectoBean p = new ProyectoBean();
                nombre = r.getString("nombre");
                id = r.getInt("id");
                fechaInicio = r.getDate("fechaInicio");
                fechaFinal = r.getDate("fechaFinal");
                
                p.setId(id);
                p.setNombre(nombre);
                p.setFechaInicio(fechaInicio);
                p.setFechaFinal(fechaFinal);
                
                lista.add(p);
            }
            
            desconectar();
            return lista;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            desconectar();
            return null;
        }
    }

}
